using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;

/// <summary>
/// Lua管理器
/// 提供Lua脚本的加载、卸载、调用等功能
/// </summary>
public class LuaMgr : BaseManager<LuaMgr>
{
    private LuaEnv luaEnv;

    /// <summary>
    /// 得到lua中的全局变量_G
    /// </summary>
    public LuaTable Global
    {
        get
        {
            return luaEnv.Global;
        }
    }

    /// <summary>
    /// 初始化Lua环境
    /// </summary>
    public void Init()
    {
        if(luaEnv != null)
            return;
        
        luaEnv = new LuaEnv();
        //加载Lua脚本
        luaEnv.AddLoader(MyCustomLoader);
        luaEnv.AddLoader(MyCustomABLoader);
    }
    
    private byte[] MyCustomLoader(ref string filepath)
    {
        //拼接Lua脚本的路径
        string path = Application.dataPath + "/Lua/" + filepath + ".lua";
        
        //判断Lua脚本文件是否存在
        if (System.IO.File.Exists(path))
        {
            //读取Lua脚本文件内容，并返回字节数组
            return System.IO.File.ReadAllBytes(path);
        }
        
        Debug.Log("Lua脚本文件不存在！" + filepath);
        
        //通过函数中的逻辑，去加载Lua脚本文件
        return null;
    }

    //重定向加载AB包中的Lua脚本
    private byte[] MyCustomABLoader(ref string filepath)
    {
        // //从AB包中加载Lua脚本
        // string path = Application.dataPath + "/Lua/";
        // //加载AB包
        // AssetBundle ab = AssetBundle.LoadFromFile(path);
        //
        // //加载Lua脚本 返回
        // TextAsset textAsset = ab.LoadAsset<TextAsset>(filepath + ".lua");
        // return textAsset.bytes;

        TextAsset lua = ABMgr.GetInstance().LoadAssetBundleSync<TextAsset>("lua", filepath + ".lua");
        if (lua == null)
        {
            Debug.Log("Lua脚本文件不存在！" + filepath);
            return null;
        }
        return lua.bytes;
    }

    /// <summary>
    /// 传入lua文件名，执行lua脚本
    /// </summary>
    /// <param name="fileName"></param>
    public void DoLuaFile(string fileName)
    {
        string str = string.Format("require '{0}'", fileName);
        DoString(str);
    }

    /// <summary>
    /// 执行Lua脚本
    /// </summary>
    /// <param name="str"></param>
    public void DoString(string str)
    {
        if (luaEnv == null)
        {
            Debug.Log("Lua环境未初始化！");
            return;
        }
        luaEnv.DoString(str);
    }
    
    /// <summary>
    /// 释放Lua脚本
    /// </summary>
    public void Tick()
    {
        if (luaEnv == null)
        {
            Debug.Log("Lua环境未初始化！");
            return;
        }
        luaEnv.Tick();
    }

    /// <summary>
    /// 销毁解析器
    /// </summary>
    public void Dispose()
    {
        if (luaEnv == null)
        {
            Debug.Log("Lua环境未初始化！");
            return;
        }
        luaEnv.Dispose();
        luaEnv = null;
    }
}